package com.stylefeng.guns;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 将pdf 转化成 图片 
 * @author yangnuo
 * 创建时间：2017年3月16日 
 */
public class PDFToImage {

    // 水印透明度  
    private static float alpha = 0.5f;
    // 水印横向位置  
    private static int positionWidth = 150;
    // 水印纵向位置  
    private static int positionHeight = 300;
    // 水印文字字体  
    private static Font font = new Font("仿宋", Font.BOLD, 26);
    // 水印文字颜色  
    private static Color color = Color.GRAY;



    /**
     * 生成pdf的缩略图 
     * @param zoom  缩略图显示倍数，1表示不缩放，0.5表示缩小到50% 
     * @param inputFile        需要生成缩略图的书籍的完整路径 
     * @param outputFile    生成缩略图的放置路径 
     */
    public List<String> pdftoIamge(float zoom,String inputFile, String outputFile) {
        List<String> list = null;
        Document document = null;
        try {
            list = new ArrayList(0);
            document = new Document();
            document.setFile(inputFile);
            float rotation = 0;
            int maxPages = document.getPageTree().getNumberOfPages();
            for (int i = 0; i < maxPages; i++) {
                BufferedImage bfimage = (BufferedImage) document.getPageImage(i,  GraphicsRenderingHints.SCREEN,Page.BOUNDARY_CROPBOX, rotation, zoom);

                bfimage = setGraphics(bfimage);

                RenderedImage rendImage = bfimage;

                ImageIO.write(rendImage, "jpg", new File(outputFile+i+".jpg"));
                bfimage.flush();
                list.add(outputFile+i+".png");
            }
        }catch (Exception e) {
            e.printStackTrace();
        }

        if(document!=null){
            document.dispose();
        }
        return list;
    }



    public BufferedImage setGraphics(BufferedImage bfimage){
        Graphics2D g = bfimage.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        // 5、设置水印文字颜色  
        g.setColor(color);
        // 6、设置水印文字Font  
        g.setFont(font);
        // 7、设置水印文字透明度  
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));
        //设置旋转  
        g.rotate(-Math.PI/6);
        g.drawString("落花雨科技", 0, (bfimage.getHeight()/2)*1);
        // 9、释放资源  
        g.dispose();
        return bfimage;
    }

    public static void main(String[] args) {
        //测试 pdf 生成 图片 （加水印）
        PDFToImage pdf = new PDFToImage();
        pdf.pdftoIamge(1.5f,"D:\\java基本语法.pdf", "D:\\image\\pdf\\");
    }


    /**
     * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩
     * @param imgsrc 源图片地址
     * @param imgdist 目标图片地址
     * @param widthdist 压缩后图片宽度（当rate==null时，必传）
     * @param heightdist 压缩后图片高度（当rate==null时，必传）
     * @param rate 压缩比例
     */
    public static void reduceImg(String imgsrc, String imgdist, int widthdist,
                                 int heightdist, Float rate) {
        try {
            File srcfile = new File(imgsrc);
            // 检查文件是否存在
            if (!srcfile.exists()) {
                return;
            }
            // 如果rate不为空说明是按比例压缩
            if (rate != null && rate > 0) {
                // 获取文件高度和宽度
                int[] results = getImgWidth(srcfile);
                if (results == null || results[0] == 0 || results[1] == 0) {
                    return;
                } else {
                    widthdist = (int) (results[0] * rate);
                    heightdist = (int) (results[1] * rate);
                }
            }
            // 开始读取文件并进行压缩
            Image src = ImageIO.read(srcfile);
            BufferedImage tag = new BufferedImage((int) widthdist,
                    (int) heightdist, BufferedImage.TYPE_INT_RGB);

            tag.getGraphics().drawImage(
                    src.getScaledInstance(widthdist, heightdist,
                            Image.SCALE_SMOOTH), 0, 0, null);

            FileOutputStream out = new FileOutputStream(imgdist);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(tag);
            out.close();

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * 获取图片宽度
     *
     * @param file
     *            图片文件
     * @return 宽度
     */
    public static int[] getImgWidth(File file) {
        InputStream is = null;
        BufferedImage src = null;
        int result[] = { 0, 0 };
        try {
            is = new FileInputStream(file);
            src = ImageIO.read(is);
            result[0] = src.getWidth(null); // 得到源图宽
            result[1] = src.getHeight(null); // 得到源图高
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}  